#include "cvariant.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 1. 定义枚举类型（颜色）
typedef enum {
    RED,
    GREEN,
    BLUE,
    BLACK,
    WHITE
} Color;

// 2. 定义联合体类型（通用数值）
typedef union {
    int i;
    float f;
    double d;
} Number;

// 3. 定义包含枚举和联合体的复杂结构体
typedef struct {
    Color color;       // 枚举成员
    Number value;      // 联合体成员
    char name[64];     // 字符串成员
} ComplexData;

// ------------------------------
// 枚举类型（Color）的操作函数
// ------------------------------
static void color_copy(const void* src, void* dest) {
    // 枚举本质是整数，直接复制内存
    *(Color*)dest = *(const Color*)src;
}

static void color_destroy(void* data) {
    // 枚举无动态内存，无需额外操作
}

// ------------------------------
// 联合体类型（Number）的操作函数
// ------------------------------
static void number_copy(const void* src, void* dest) {
    // 联合体整体复制
    memcpy(dest, src, sizeof(Number));
}

static void number_destroy(void* data) {
    // 联合体无动态内存，无需额外操作
}

// ------------------------------
// 复杂结构体（ComplexData）的操作函数
// ------------------------------
static void complexdata_copy(const void* src, void* dest) {
    const ComplexData* s = (const ComplexData*)src;
    ComplexData* d = (ComplexData*)dest;
    
    // 分别复制成员（枚举+联合体+字符串）
    d->color = s->color;
    d->value = s->value;  // 联合体直接复制
    strncpy(d->name, s->name, sizeof(d->name)-1);
}

static void complexdata_destroy(void* data) {
    // 若结构体包含动态内存（如malloc的指针），需在此释放
    // 本示例无动态内存，仅作演示
}

int main() {
    // 1. 注册自定义类型（获取类型ID）
    TypeId color_type = cvariant_register_custom_type(
        sizeof(Color), color_copy, color_destroy
    );
    TypeId number_type = cvariant_register_custom_type(
        sizeof(Number), number_copy, number_destroy
    );
    TypeId complex_type = cvariant_register_custom_type(
        sizeof(ComplexData), complexdata_copy, complexdata_destroy
    );

    printf("注册类型ID：\n");
    printf("  Color: %d\n", color_type);
    printf("  Number: %d\n", number_type);
    printf("  ComplexData: %d\n\n", complex_type);

    // 2. 创建变体对象
    struct CVariant* var = cvariant_create();
    if (!var) {
        fprintf(stderr, "创建变体失败\n");
        return 1;
    }

    // 3. 测试枚举类型（Color）
    Color my_color = BLUE;
    cvariant_set_custom(var, color_type, &my_color);
    
    if (cvariant_get_type(var) == color_type) {
        Color get_color;
        cvariant_get_custom(var, &get_color);
        printf("枚举类型测试：\n");
        printf("  存储的颜色: %d (BLUE对应值为2)\n", get_color);
    }

    // 4. 测试联合体类型（Number）
    Number my_num;
    my_num.f = 3.14159f;  // 存储float值
    cvariant_set_custom(var, number_type, &my_num);
    
    if (cvariant_get_type(var) == number_type) {
        Number get_num;
        cvariant_get_custom(var, &get_num);
        printf("\n联合体类型测试：\n");
        printf("  存储的float值: %f\n", get_num.f);
    }

    // 5. 测试复杂结构体（包含枚举和联合体）
    ComplexData my_complex = {
        .color = GREEN,
        .value = {.d = 99.99},  // 联合体存储double
        .name = "示例数据"
    };
    cvariant_set_custom(var, complex_type, &my_complex);
    
    if (cvariant_get_type(var) == complex_type) {
        ComplexData get_complex;
        cvariant_get_custom(var, &get_complex);
        printf("\n复杂结构体测试：\n");
        printf("  颜色枚举值: %d (GREEN对应值为1)\n", get_complex.color);
        printf("  联合体double值: %lf\n", get_complex.value.d);
        printf("  名称: %s\n", get_complex.name);
    }

    // 6. 清理资源
    cvariant_destroy(var);
    return 0;
}